package org.xxpay.mch.config;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import java.util.Locale;

/**
 * 国际化配置类 - 商户系统
 * 支持中英文双语言切换
 * 
 * @author xxpay
 */
@Configuration
public class I18nConfig implements WebMvcConfigurer {

    /**
     * 消息资源配置
     * 支持多个资源文件：messages、errors、validation
     */
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 设置资源文件基础名称
        messageSource.setBasenames(
            "i18n/messages",     // 通用消息
            "i18n/errors",       // 错误消息  
            "i18n/validation",   // 验证消息
            "i18n/business"      // 业务消息
        );
        // 设置编码
        messageSource.setDefaultEncoding("UTF-8");
        // 设置缓存时间（秒）
        messageSource.setCacheSeconds(3600);
        // 找不到消息时使用消息键作为默认值
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }

    /**
     * 语言解析器配置
     * 基于Cookie存储用户语言偏好
     */
    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        // 设置默认语言为中文
        resolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        // 设置Cookie名称
        resolver.setCookieName("xxpay_locale");
        // 设置Cookie有效期（1年）
        resolver.setCookieMaxAge(365 * 24 * 60 * 60);
        // 设置Cookie路径
        resolver.setCookiePath("/");
        return resolver;
    }

    /**
     * 语言切换拦截器
     * 支持通过URL参数切换语言
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        // 设置语言参数名
        interceptor.setParamName("lang");
        return interceptor;
    }

    /**
     * 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}
